import cv2
from mss import mss
from PIL import Image, ImageTk


def capture_screen():
    """
    捕获当前主显示器的屏幕。
    使用 mss 库来捕获屏幕，将捕获的图像保存为临时文件 'screen.png'，
    然后使用 OpenCV 读取这个图像文件。
    返回: 读取的图像数组。
    """
    with mss() as sct:
        monitor = sct.monitors[1]  # 捕获主显示器
        sct_img = sct.shot(mon=1, output='screen.png')  # 保存屏幕截图为 'screen.png'
        return cv2.imread('screen.png')  # 使用 OpenCV 读取图像


def update_preview(preview_label):
    """
    更新预览标签中的图像。
    此函数捕获屏幕，转换图像为 Tkinter 兼容格式，并更新标签以显示图像。
    使用了递归的方式每 100 毫秒调用一次自身，以持续更新图像。

    参数:
    preview_label (tk.Label): 用于显示图像的 Tkinter 标签。
    """
    img = capture_screen()  # 捕获屏幕
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 将图像从 BGR 转换为 RGB
    img_pil = Image.fromarray(img_rgb)  # 将 NumPy 数组转换为 PIL 图像
    img_tk = ImageTk.PhotoImage(image=img_pil)  # 从 PIL 图像创建 Tkinter 兼容的 PhotoImage
    preview_label.config(image=img_tk)  # 更新标签显示新的图像
    preview_label.image = img_tk  # 避免垃圾回收
    preview_label.after(100, lambda: update_preview(preview_label))  # 每 100 毫秒刷新一次
